package config

import (
	"fmt"
	"github.com/zxmrlc/log"
	"strings"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

//定义config结构体,Name为配置文件名
type Config struct{
	Name string
}

//为结构体添加initConfig方法，初始化配置文件
func (c *Config) initConfig() error {
	if c.Name != "" {
 	// 如果指定了配置文件，则解析指定的配置文件
 	viper.SetConfigFile(c.Name)
	} else {
		// 如果没有指定配置文件，则解析默认的配置文件（conf/config）
 		viper.AddConfigPath("conf")
 		viper.SetConfigName("config")
	}
	// 设置配置文件格式为YAML
	viper.SetConfigType("yaml") 
 
	// 读取匹配的环境变量
	viper.AutomaticEnv() 
	// 读取环境变量的前缀为APISERVER
	viper.SetEnvPrefix("APISERVER")
	// 设置环境变量的读取规则,把点号('.')映射成下划线('_')
	replacer := strings.NewReplacer(".", "_")
	viper.SetEnvKeyReplacer(replacer)
 
	// viper解析配置文件
	if err := viper.ReadInConfig(); err != nil {
		return err
	}
	return nil
}

// 监控配置文件变化并热加载程序
func (c *Config) watchConfig() {
	viper.WatchConfig()
	viper.OnConfigChange(func(e fsnotify.Event) {
		log.Infof("Config file changed: %s", e.Name)
	})
}

func Init(cfg string) error {
	c := Config{
		Name: cfg,
	}


	// 初始化配置文件
	if err := c.initConfig(); err != nil {
		return err
	}

	// 监控配置文件变化并热加载程序
	c.watchConfig()

	//- add here -初始化日志包
	c.initLog()
	return nil
}


//给Config添加initLog方法
func (c *Config) initLog(){
	passLagerCfg := log.PassLagerCfg{
		Writers: 		viper.GetString("log.writers"),
 		LoggerLevel: 	viper.GetString("log.logger_level"),
		LoggerFile: 	viper.GetString("log.logger_file"),
 		LogFormatText: 	viper.GetBool("log.log_format_text"),
 		RollingPolicy: 	viper.GetString("log.rollingPolicy"),
 		LogRotateDate: 	viper.GetInt("log.log_rotate_date"),
 		LogRotateSize: 	viper.GetInt("log.log_rotate_size"),
 		LogBackupCount: viper.GetInt("log.log_backup_count"),	
	}
	//使用配置项初始化log
	log.InitWithConfig(&passLagerCfg)

}

func main() {
	fmt.Println("vim-go")
}
